/*
1:下载axios
2:导入axios
3:创建axios副本(基地址)
4:创建请求拦截与响应拦截
5:暴露出去
6：src/api/模块名.ts
7:导入使用
*/
// 使用环境变量
/*
开发环境 npm run dev/serve
  根目录创建一个.dev.development
  定义变量：以VITE_开头
      如:VITE_APP_URL =  '基地址'
  访问：import.meta.env.VITE_APP_URL
生产环境 npm run build
  根目录创建一个.dev.production
  定义变量：以VITE_开头
      如:VITE_APP_URL =  '基地址'
  访问：import.meta.env.VITE_APP_URL
*/

import { useUserStore } from '@/stores'
import type { ApiRes } from '@/types/test'
import axios, { type Method } from 'axios'
import { showFailToast } from 'vant'
import router from '@/router' // router===this.$router
// router使用:vue文件的script部分,其它地方和vue2都是一样
const request = axios.create({
  baseURL: import.meta.env.VITE_APP_URL
})
request.interceptors.request.use(
  config => {
    const userStore = useUserStore()
    if (userStore.userInfo?.token) {
      config.headers.authorization = `Bearer ${userStore.userInfo?.token}`
    }
    return config
  },
  err => {
    return Promise.reject(err)
  }
)
//
/*
token失效
1:在响应拦截拦截该401错误
2：错误内：
   提示错误
   删除token与用户信息
   跳转到登录页
*/
request.interceptors.response.use(
  res => {
    // 请求状态码2开头
    if (res.data.code === 10000) {
      return res.data
    } else {
      showFailToast(res.data.message)
      return Promise.reject(new Error(res.data.message))
    }
  },
  err => {
    // 请求状态码非2开头
    // console.log('错误')
    // console.dir(err)
    // const obj = { a: 1 }
    // console.log(obj)
    // obj.a = 2

    console.log('router', router)
    if (err.response && err.response.status === 401) {
      showFailToast(err.response.data.message)
      const userStore = useUserStore()
      userStore.logout()

      router.push('/login?redirect=' + router.currentRoute.value.fullPath)
    }

    return Promise.reject(err)
  }
)
function ajax<T> (url: string, method: Method = 'get', data: object = {}) {
  const requestMode = method.toLowerCase() === 'get' ? 'params' : 'data'
  return request<any, ApiRes<T>>({
    url: url,
    method: method,
    [requestMode]: data
  })
}

// function fn<T>(a:T):T{
//   return a
// }
// fn<string>('hello')

export default ajax
